---
displayed_sidebar: "Chinese"
---

# substr, substring

## 功能

从一个字符串 (`str`) 的指定位置(`pos`) 开始截取指定长度 (`len`) 的字符。

- 如果指定了 `len` 参数时，返回从位置 `pos` 开始的长度为 `len` 的子字符串。
- 如果没有指定 `len` 参数，返回从位置 `pos` 开始的所有字符组成的字符串。

## 语法

```Haskell
VARCHAR substr(VARCHAR str, INT pos[, INT len]);
```

## 参数说明

- `str`: 必选，支持的数据类型为 VARCHAR。

- `pos`: 必选，支持的数据类型为 INT。
  - `pos` 可以使用负值，在这种情况下，从字符串 `str` 末尾从右往左开始计算 `pos` 个字符，见示例二。
  - 如果 `pos` 的值为 0，返回一个空字符串。
  - 如果指定的起始位置超出了字符串的位数范围，返回空字符串，见示例三。

  > 注：字符串中第一个字符的位置为 1。

- `len`: 可选，支持的数据类型为 INT。如果不指定，默认返回 `pos` 后的所有字符。如果要返回的字符字数超出了实际匹配的字符个数，返回所有匹配的字符，见示例四。

## 返回值说明

返回值的数据类型为 VARCHAR。

## 示例

```Plain Text
-- 返回 "starrocks" 字符串从第三位字符 "a" 开始的所有字符，未指定字符长度。
mysql> select substr("starrocks",3);
+------------------------+
| substr('starrocks', 3) |
+------------------------+
| arrocks                |
+------------------------+
1 row in set (0.00 sec)

-- 返回 "starrocks" 字符串从右往左数第二位字符 "k" 开始的所有字符，未指定字符长度。
mysql> select substring("starrocks",-2);
+----------------------------+
| substring('starrocks', -2) |
+----------------------------+
| ks                         |
+----------------------------+
1 row in set (0.00 sec)

-- 指定的位数 8 超过了 "apple" 字符串的总位数，返回空字符串。
MySQL > select substring("apple", 8, 2);
+--------------------------------+
| substring('apple', 8, 2)       |
+--------------------------------+
|                                |
+--------------------------------+

-- 返回 "apple" 字符串中从第一位字符开始的 9 个字符。9 超过了匹配的字符个数，返回所有匹配的字符。
MySQL > select substring("apple", 1, 9);
+--------------------------+
| substring('apple', 1, 9) |
+--------------------------+
| apple                    |
+--------------------------+
```
